475. 供暖器
475. 供暖器
Similar Question
leading to the advanced question
Solution Tips
方案一: 双指针
var findRadius = function(houses, heaters) {
// 所有的加热器中, 离加热器最远的房屋的距离就是最小半径
// 从左到右遍历, 先找到第一个加热器, 在这个加热器左边的所有房屋都只能靠它一个人加热
// 从右到左遍历, 找到最后一个加热器, 所有的在其右边的房屋都只能靠它一个人加热
// 这样能确定最小的加热半径, 起码得有这么多
// 然后再重新遍历一遍, 去找每一个房屋, 离他最近的加热器有多远, 找到一个房屋, 就去找对应的加热器
// 暴力法就是这样做了, 但是每次查找存在重复
// 比如我在1查到, 离他最近的加热器是 5, 那么对于2来说, 最近的加热器就是 5 - 1 的距离, 是不需要重新遍历加热器数组的, 这个前提是 house[i + 1] < heat[i]
// 在确定了 1 需要 5 的加热器之后, 半径就是 4 了, 所以可以直接跳到 9 号房屋, 而且我们知道有一个加热器离他的距离为4, 所以继续往后找看看下一个加热器在哪里, 如果距离小于4, 就用新的加热器, 如果距离大于 4, 那么让旧的加热器增大或者让新的加热器变成4都是一样的, 具体就看哪个更近
houses.sort((a, b) => a - b);
heaters.sort((a, b) => a - b);
let ans = 0;
for (let i = 0, j = 0; i < houses.length; i++) {
let curDistance = Math.abs(houses[i] - heaters[j]);
while (j < heaters.length - 1 && Math.abs(houses[i] - heaters[j]) >= Math.abs(houses[i] - heaters[j + 1])) {
j++;
curDistance = Math.min(curDistance, Math.abs(houses[i] - heaters[j]));
}
ans = Math.max(ans, curDistance);
}
return ans;
};